// c++标准异常类
#include <iostream>
#include <exception>    //标准异常类
#include <system_error>
#include <cerrno>
using namespace std;

//构建自己的异常类

void f3(int n)
{
    //当遇到三种不同的异常需要区别以待时
    //抛出三种不同类型的异常
    if(n == 1)
        throw invalid_argument("非法参数");
    if(n == 2)
        throw out_of_range("数据溢出");
    if(n == 3)
        throw system_error(std::error_code(),"系统出错");

    cout << "程序正常执行" << endl;
}

void f2(int n)
{
    try{
        f3(n);
    }
    catch(invalid_argument &e)
    {
        cout << e.what() << endl;
        cout << "处理完毕" << endl;
    }
}

void f1(int n)
{
    try{
        f3(n);
    }
    catch(out_of_range &e)
    {
        cout << e.what() << endl;
        cout << "处理完毕" << endl;
    }
}

int main()
{
    int x(9);
    int n;

    while(1)
    {
        cin >> n;
        try{
            f1(n);
        }
        catch(const std :: exception &e)
        {
            std ::cerr << e.what() << '\n';
        }
    }

    cout << "遇到异常情况3时，程序无法处理，将被终止" <<endl;

    return 0;
}